package sanduche.controllers;

import java.util.ArrayList;
import java.util.List;

import models.CalificacionPeriodo;
import models.Colegio;
import models.Curso;
import models.Estudiante;
import models.Indicador;
import models.Materia;
import models.Mensaje;
import models.Periodo;
import play.db.jpa.Transactional;
import play.libs.Json;
import play.mvc.Http.Session;
import sanduche.play.shared.ModuleConfig;
import sanduche.play.shared.RequestMethod;
import sanduche.play.shared.Route;
import sanduche.play.shared.UrlParam;
import services.AcudienteSrv;
import services.ColegioSrv;
import services.DAO;
import services.MessagingSrv;
import util.SessionObj;
import util.SessionObj.Acudiente;

@ModuleConfig(prefix = "/api/acudiente", javascriptDirPath = "public/acudiente/js/")
public class AcudienteController {

	private static SessionObj getSessionObj(Session session) {
		return Json.fromJson(
				Json.parse(session.get(UserController.SESSION_OBJ)),
				SessionObj.class);
	}

	private static void isAuthorized(Session session, Long idEstudiante)
			throws Exception {
		if (!getSessionObj(session).getAcudiente().getEstudiantes()
				.containsKey(idEstudiante))
			throw new Exception("No tiene permisos sobre este recurso");
	}

	@Transactional(readOnly = true)
	@Route(value = "/estudiante", method = RequestMethod.GET, iteratedClass = Estudiante.class)
	public static List<Estudiante> getEstudiantes(Session session) {
		List<Estudiante> res = DAO
				.execute(
						"SELECT e FROM Estudiante e WHERE e.idAcudiente = :idAcudiente",
						-1, "idAcudiente", getSessionObj(session)
								.getAcudiente().getId());
		return res;
	}

	@Transactional(readOnly = true)
	@Route(value = "/estudiante/:idEstudiante/curso/", method = RequestMethod.GET)
	public static Curso getCursoEstudiante(
			@UrlParam("idEstudiante") Long idEstudiante,
			@UrlParam("idCalendarioAcademico") Long idCalendarioAcademico) {
		// if (isAuthorized(idEstudiante))
		// return unauthorized();
		return AcudienteSrv.getCursoEstudiante(idEstudiante,
				idCalendarioAcademico);
	}

	@Transactional(readOnly = true)
	@Route(value = "/estudiante/:idEstudiante/colegio", method = RequestMethod.GET)
	public static Colegio getColegioEstudiante(
			@UrlParam("idEstudiante") Long idEstudiante) {

		return AcudienteSrv.getColegioEstudiante(idEstudiante);
	}

	@Transactional(readOnly = true)
	@Route(value = "/materia", method = RequestMethod.GET, iteratedClass = Materia.class)
	public static List<Materia> getMateriasGrado(
			@UrlParam("idGrado") Long idGrado,
			@UrlParam("idCalendarioAcademico") Long idCalendarioAcademico) {

		return AcudienteSrv.getMateriasGrado(idGrado, idCalendarioAcademico);
	}

	@Transactional(readOnly = true)
	@Route(value = "/periodo", method = RequestMethod.GET, iteratedClass = Periodo.class)
	public static List<Periodo> getPeriodosCalendario(
			@UrlParam("idCalendarioAcademico") Long idCalendarioAcademico) {

		return ColegioSrv.getPeriodosCalendario(idCalendarioAcademico);
	}

	@Transactional(readOnly = true)
	@Route(value = "/calificacion_periodo/:idEstudiante/:idMateria/:idCalendarioAcademico", method = RequestMethod.GET, iteratedClass = CalificacionPeriodo.class)
	public static List<CalificacionPeriodo> getCalificacionesCalendario(
			Session session, @UrlParam("idEstudiante") Long idEstudiante,
			@UrlParam("idMateria") Long idMateria,
			@UrlParam("idCalendarioAcademico") Long idCalendarioAcademico)
			throws Exception {
		isAuthorized(session, idEstudiante);

		return AcudienteSrv.getCalificacionesCalendario(idEstudiante,
				idMateria, idCalendarioAcademico);
	}

	@Transactional(readOnly = true)
	@Route(value = "/indicador_periodo/:idEstudiante/:idMateria/:idPeriodo", method = RequestMethod.GET, iteratedClass = Indicador.class)
	public static List<Indicador> getIndicadoresPeriodo(Session session,
			@UrlParam("idEstudiante") Long idEstudiante,
			@UrlParam("idMateria") Long idMateria,
			@UrlParam("idPeriodo") Long idPeriodo) throws Exception {
		isAuthorized(session, idEstudiante);

		return AcudienteSrv.getIndicadoresPeriodo(idEstudiante, idMateria,
				idPeriodo);
	}

	@Transactional(readOnly = true)
	@Route(value = "/feed", method = RequestMethod.GET, iteratedClass = Mensaje.class)
	public static List<Mensaje> getMensajes(Session session,
			@UrlParam("since") Long since, @UrlParam("util") Long until)
			throws Exception {
		Acudiente acudiente = getSessionObj(session).getAcudiente();

		if (acudiente != null) {
			List<String> suscripciones = new ArrayList<String>();
			for (Long idEstudiante : acudiente.getEstudiantes().keySet()) {
				suscripciones.addAll(MessagingSrv
						.getSuscripcionesEstudiante(idEstudiante));
			}
			return MessagingSrv.getMensajes(suscripciones, since, until);
		}
		throw new Exception("No tiene permisos sobre estos recursos");
	}
}
